package tools;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.util.List;

import javax.swing.table.TableColumn;

import model.Giocatore;
import model.PersistentObject;
import app.GuiView;

import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.EmbeddedConfiguration;
import com.db4o.query.Query;

public class GiovanileCanzesedb {

	private ObjectContainer db;

	public GiovanileCanzesedb() {
		// open database
		EmbeddedConfiguration configuration = Db4oEmbedded.newConfiguration();
		configuration.common().updateDepth(999);
		configuration.common().activationDepth(999);
		// configuration.file().lockDatabaseFile(false);

		db = Db4oEmbedded.openFile(configuration, "giovanilecanzese.db4o");
	}

	/**
	 * Main
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Giovanile Canzese db starting...");

		GiovanileCanzesedb es = new GiovanileCanzesedb();

		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(
					System.in));
			String commandLine = "";
			while (commandLine.compareTo("exit") != 0) {
				System.out.print("> ");
				commandLine = in.readLine();
				es.process(commandLine);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		// close database
		System.out.println("closing database...");
		es.db.close();

		// exit
		System.out.println("Giovanile Canzese db exiting...");
		System.exit(0);
	}

	private void process(String commandLine) {
		try {
			String[] args = Commandline.translateCommandline(commandLine);

			if (args.length == 0) {
				System.out.println("no command found");
			}
			// lista - uso: lista nomeClasse
			if (args[0].equals("lista")) {
				lista(args[1]);
			}
			// lista2 - uso: lista nomeClasse
			if (args[0].equals("lista2")) {
				lista2(args[1]);
			}

			// addGiocatore - uso: addGiocatore nome cognome
			// dataNascita(dd/MM/yyyy)
			// numerocartellino scadenzaVisita(dd/MM/yyyy)
			else if (args[0].equals("addGiocatore")) {
				addGiocatore(args[1], args[2], args[3],
						Integer.parseInt(args[4]), args[5]);
			}

			// addAscensore - uso: addGiocatore nome cognome
			// dataNascita(dd/MM/yyyy)
			// numerocartellino
			else if (args[0].equals("removeGiocatore")) {
				removeGiocatore(Integer.parseInt(args[1]));
			}

			else {
				System.out.println(commandLine + ": command " + args[0]
						+ " not found");
			}
		} catch (Throwable t) {
			// t.printStackTrace();
			System.out.println("An error occured: " + t);
		}

	}

	private void addGiocatore(String nome, String cognome, String dataNascita,
			int numeroCartellino, String scadenzaVisita) throws ParseException {

		Giocatore giocatore = new Giocatore(nome, cognome, dataNascita,
				numeroCartellino, scadenzaVisita);
		db.store(giocatore);
		db.commit();
		printNewObject(giocatore);

	}

	public void removeGiocatore(int idGiocatore) {
		// TODO
		Giocatore intervento = (Giocatore) getObjectById(Giocatore.class,
				idGiocatore);
		db.delete(intervento);
		db.commit();
		printDeleteObject(intervento);

	}

	private void lista(String classString) throws ClassNotFoundException {
		ObjectSet<PersistentObject> result = db.queryByExample(Class
				.forName("model." + classString));
		
		TableColumn c = new TableColumn(1, 5);
		GuiView gui = new GuiView();
		gui.setVisible(true);
		//gui.table.addColumn(c);
		//gui.table.setVisible(true);
		gui.addList(result.toArray());
		printResult(result);
	}

	private void lista2(String classString) throws ClassNotFoundException {
		ObjectSet<PersistentObject> result = db.queryByExample(Class
				.forName("model." + classString));
		printResult2(result);
	}

	private <T> PersistentObject getObjectById(Class<T> objectClass, int id) {
		Query query = db.query();
		query.constrain(objectClass);
		query.descend("id").constrain(id);
		List<PersistentObject> result = query.execute();
		return result.get(0);
	}

	private void printResult2(ObjectSet<PersistentObject> result) {
		while (result.hasNext()) {
			PersistentObject po = result.next();
			System.out.println("- " + po + " [id:" + po.getId() + "]");
		}
		System.out.println(result.size() + " element"
				+ ((result.size() == 1) ? "o" : "i") + " trovat"
				+ ((result.size() == 1) ? "o" : "i"));
	}

	private void printResult(ObjectSet<PersistentObject> result) {
		while (result.hasNext()) {
			PersistentObject po = result.next();
			System.out.println("- " + po.toString());
		}
		System.out.println(result.size() + " element"
				+ ((result.size() == 1) ? "o" : "i") + " trovat"
				+ ((result.size() == 1) ? "o" : "i"));
	}

	private void printNewObject(PersistentObject newObject) {
		System.out.println("Salvato nuovo "
				+ newObject.getClass().getSimpleName() + " con id:"
				+ newObject.getId());
	}

	private void printDeleteObject(PersistentObject newObject) {
		System.out.println("Cancellato " + newObject.getClass().getSimpleName()
				+ " con id:" + newObject.getId());
	}

}
